  @256
  D=A
  @SP
  M=D
  // call Sys.init 0
  @undefined$ret.0
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  @LCL
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @ARG
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THIS
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THAT
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @5
  D=A
  @SP
  D=M-D
  @ARG
  M=D
  @SP
  D=M
  @LCL
  M=D
  @Sys.init
  0;JMP
(undefined$ret.0)
  // function Main.fibonacci 0
(Main.fibonacci)
  // push argument 0
  @0
  D=A
  @ARG
  A=M+D
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  // push constant 2
  @2
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  // lt
  @SP
  AM=M-1
  D=M
  @SP
  A=M-1
  D=M-D
  @TRUE.1
  D;JLT
(FALSE.1)
  D=0
  @PUSH.1
  0;JMP
(TRUE.1)
  D=-1
(PUSH.1)
  @SP
  A=M-1
  M=D
  // if-goto IF_TRUE
  @SP
  AM=M-1
  D=M
  @Main.fibonacci$IF_TRUE
  D;JNE
  // goto IF_FALSE
  @Main.fibonacci$IF_FALSE
  0;JMP
  // label IF_TRUE
(Main.fibonacci$IF_TRUE)
  // push argument 0
  @0
  D=A
  @ARG
  A=M+D
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  // return
  @LCL
  D=M
  @frame_2
  M=D
  @5
  D=A
  @frame_2
  A=M-D
  D=M
  @ret_3
  M=D
  @SP
  M=M-1
  A=M
  D=M
  @ARG
  A=M
  M=D
  @ARG
  D=M+1
  @SP
  M=D
  @1
  D=A
  @frame_2
  A=M-D
  D=M
  @THAT
  M=D
  @2
  D=A
  @frame_2
  A=M-D
  D=M
  @THIS
  M=D
  @3
  D=A
  @frame_2
  A=M-D
  D=M
  @ARG
  M=D
  @4
  D=A
  @frame_2
  A=M-D
  D=M
  @LCL
  M=D
  @ret_3
  A=M
  0;JMP
  // label IF_FALSE
(Main.fibonacci$IF_FALSE)
  // push argument 0
  @0
  D=A
  @ARG
  A=M+D
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  // push constant 2
  @2
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  // sub
  @SP
  AM=M-1
  D=M
  @SP
  A=M-1
  M=M-D
  // call Main.fibonacci 1
  @Main.fibonacci$ret.4
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  @LCL
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @ARG
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THIS
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THAT
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @6
  D=A
  @SP
  D=M-D
  @ARG
  M=D
  @SP
  D=M
  @LCL
  M=D
  @Main.fibonacci
  0;JMP
(Main.fibonacci$ret.4)
  // push argument 0
  @0
  D=A
  @ARG
  A=M+D
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  // push constant 1
  @1
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  // sub
  @SP
  AM=M-1
  D=M
  @SP
  A=M-1
  M=M-D
  // call Main.fibonacci 1
  @Main.fibonacci$ret.5
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  @LCL
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @ARG
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THIS
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THAT
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @6
  D=A
  @SP
  D=M-D
  @ARG
  M=D
  @SP
  D=M
  @LCL
  M=D
  @Main.fibonacci
  0;JMP
(Main.fibonacci$ret.5)
  // add
  @SP
  AM=M-1
  D=M
  @SP
  A=M-1
  M=M+D
  // return
  @LCL
  D=M
  @frame_6
  M=D
  @5
  D=A
  @frame_6
  A=M-D
  D=M
  @ret_7
  M=D
  @SP
  M=M-1
  A=M
  D=M
  @ARG
  A=M
  M=D
  @ARG
  D=M+1
  @SP
  M=D
  @1
  D=A
  @frame_6
  A=M-D
  D=M
  @THAT
  M=D
  @2
  D=A
  @frame_6
  A=M-D
  D=M
  @THIS
  M=D
  @3
  D=A
  @frame_6
  A=M-D
  D=M
  @ARG
  M=D
  @4
  D=A
  @frame_6
  A=M-D
  D=M
  @LCL
  M=D
  @ret_7
  A=M
  0;JMP
  // function Sys.init 0
(Sys.init)
  // push constant 4
  @4
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  // call Main.fibonacci 1
  @Sys.init$ret.8
  D=A
  @SP
  M=M+1
  A=M-1
  M=D
  @LCL
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @ARG
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THIS
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @THAT
  D=M
  @SP
  M=M+1
  A=M-1
  M=D
  @6
  D=A
  @SP
  D=M-D
  @ARG
  M=D
  @SP
  D=M
  @LCL
  M=D
  @Main.fibonacci
  0;JMP
(Sys.init$ret.8)
  // label WHILE
(Sys.init$WHILE)
  // goto WHILE
  @Sys.init$WHILE
  0;JMP